class Observer {
    constructor(data){
        this.walk(data)
    }
    // 遍历对象的所有属性
    walk(data){
        //1 判断 data 是否是对象
        if(!data || typeof data !== 'object'){
            return
        }
        // 2 遍历data对象的所有属性
        Object.keys(data).forEach(key => {
            this.defineReactive(data, key, data[key])
        })
    }
    // 调用 defineProperty 转换为 getter/setter
    defineReactive(data,key, val){
        // 如果 val 是对象，将val内部的属性转换成getter/setter
        this.walk(val)
        // 负责收集依赖，并发送通知
        let dep = new Dep() 
        let that = this;

       Object.defineProperty(data, key, {
           enumerable:true,
           configurable:true,
           get(){
               //收集依赖
               Dep.target && dep.addSub(Dep.target)
               return val // return obj[key] 会发生死递归
           },
           set(newValue){
            if(val == newValue){
                return
            }
            val = newValue
            that.walk(newValue) // this 指向 data 对象
            //发送通知
            dep.notify()
           }
       })
    }
}